/**
 * @file    bt_io.c
 * @author  chenwenrui
 * @brief   IO输入状态
 * @version V1.0
 * @date 2023-12-25
 * @copyright Copyright (c) 2022
 *
 * 系统资源:
 * 		IO: 74h165
 * 			P35
 * 			P32
 * 			P33
 */

#include "GPIO.h"
#include "delay.h"
#include "bt_io.h"

/**
 * @brief  读取开关输入状态
 * @param  none
 * @note   none
 * @retval
 * 		@ret 返回输入状态，按bit状态
 */
static unsigned long  get_switchs(void)
{
	unsigned char  i = 0;
	unsigned long  In = 0;
	unsigned char In1 = 0;
	unsigned char In2 = 0;
	unsigned char In3 = 0;
	unsigned char In4 = 0;

	//锁存
	P35 = 0;
	Delay(1);
	P35 = 1;

	for (i = 0; i < 8; i++)
	{
		In1 = In1 << 1;
		//数据
		if (P33 == 1)
			In1 = In1 + 1;
		//时钟
		P32 = 0;
		Delay(1);
		P32 = 1;
	}

	for (i = 0; i < 8; i++)
	{
		In2 = In2 << 1;
		//数据
		if (P33 == 1)
			In2 = In2 + 1;
		//时钟
		P32 = 0;
		Delay(1);
		P32 = 1;
	}

	In = In2 * 0x100 + In1;

	// if (closeflag) //常闭
	// 	In = ~In & 0xffffff;
	// //In = In & 0xffffff;
	// else //常开
	// 	In = In & 0xffffff;
	// //In = ~In & 0xffffff;

	return In;
}
/**
 * @brief  获取IO状态
 * @param  status:板卡输入状态
 * @note
 * @retval
 */
void bt_io_get_status(bt_io_status_s *status)
{
	// 
	status->board_addr=0; //未用到
	status->board_type=0; //未用到
	status->inputs=get_switchs(); // 12路输入状态
}

/**
 * @brief  IO初始化
 * @note
 * @retval
 */
void bt_io_init(void)
{
    GPIO_InitTypeDef xdata GPIO_InitStructure; // 结构定义

    // 拨码开关地址
    GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_PullUp;                                                                // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);
    // 板卡类型
    GPIO_InitStructure.Pin = GPIO_Pin_4;        // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_PullUp;      // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); // 初始化
    GPIO_InitStructure.Pin = GPIO_Pin_6;        // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_PullUp;      // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3, &GPIO_InitStructure); // 初始化

    // 74H165
    GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_5; // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_OUT_PP;            // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);       // 初始化
    GPIO_InitStructure.Pin = GPIO_Pin_3;        // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_PullUp;      // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3, &GPIO_InitStructure); // 初始化
    
}